package util;


import message.Message;


import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 套接字工具类
 */
public class SocketUtil {
    private static final String IP="127.0.0.1";
    private static final int PORT=8888;

    /**
     * 向服务器端发送信息
     * @param msg 消息
     * @param <T> 因为不确定发送消息携带的数据类型，因此使用泛型
     * @param <V> 因为不确定接受的数据类型，因此使用泛型
     */

    public static <T,V> V sendMessage(Message<T> msg){
        new Thread(() ->{});


          try {
              Socket client = new Socket(IP,PORT);
              System.out.println("服务器端已连接");
              //获取输出流
              OutputStream os=client.getOutputStream();
              //将输出流包装为对象输出流
              ObjectOutputStream oos=new ObjectOutputStream(os);
              //对象流写对象，也就是信息传输
              oos.writeObject(msg);
              //强制将通道中的信息刷出
              oos.flush();
              //告诉服务器，信息传输已经完毕
              client.shutdownOutput();
              System.out.println("信息发送完毕");
              //获取输入流
              InputStream is=client.getInputStream();
              System.out.println("服务器端已接收到信息");
              //将输入流包装为对象输入流(这一行被异常阻塞，正在排查原因)

              System.out.println("11");
              ObjectInputStream ois=new ObjectInputStream(is);
              System.out.println("22");
              V result= (V) ois.readObject();
              System.out.println("33");
              //告诉服务器端，信息读取已经完毕

              client.shutdownInput();
              System.out.println("信息读取完毕");

              return result;
          } catch (Exception e) {
              e.printStackTrace();
              return null;
          }
    }




}
